package br.uniceub.fsw.academicmobile.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.text.ParseException;
import java.util.ArrayList;

import br.uniceub.fsw.academicmobile.util.ImportarArquivoXml;
import br.uniceub.fsw.academicmobile.vo.AlunoVO;
import br.uniceub.fsw.academicmobile.vo.DisciplinaVO;
import br.uniceub.fsw.academicmobile.vo.FrequenciaVO;
import br.uniceub.fsw.academicmobile.vo.MencaoVO;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;

/**
 * Dao responsável pelas operaçoes de banco associadas ao caso de uso
 * de importaçao de xml para o banco
 * @author Dejavu
 */
public class ExportaXmlParaBDDAO {	
	
    private BD bd = null;
    private Connection con = null;
    private ImportarArquivoXml importXml = null;
    private PreparedStatement pstmt = null;
    private String SQL_ADD_FREQUENCIA = "insert into tb_frequencia(tb_historico_ID_historico, tb_aula_ID_aula, DT_mes, TP_frequencia1, TP_frequencia2) values(?,?,?,?,?)";	
    private String SQL_ADD_MENCAO = "insert into tb_mencao(tb_historico_ID_historico, tb_tipoMencao_ID_tipoMencao, tb_SGMencao_ID_tipoMencao, DT_mencao, DS_mencao) values(?,?,?,?,?)";
    private String historico = "";

    /**
     * Construtor recebendo o arquivo importarArquivoXml
     * @param importXml 
     */
    public ExportaXmlParaBDDAO(ImportarArquivoXml importXml) {
    	this.importXml = importXml;
        bd = new BD();
        con = bd.getCn();
    }
		
    public ImportarArquivoXml getImportXml() {
        return importXml;
    }

    public void setImportXml(ImportarArquivoXml importXml) {
        this.importXml = importXml;
    }

    /**
     * Exporta dados do XML para o banco
     * @return boolean true caso haja sucesso
     */
    public boolean exportaParaBd() {

    if(importXml == null)
        return false;
    	
    	ArrayList disciplinasListDTO = importXml.getDisciplinasListDTO();
    	
    	for(int i=0; i < disciplinasListDTO.size();i++) {
            DisciplinaVO disciplina = (DisciplinaVO) disciplinasListDTO.get(i);    		
            ArrayList alunosListDTO = (ArrayList) disciplina.getAlunos();
    		
            for(int j=0; j < alunosListDTO.size();j++) {
                AlunoVO aluno = (AlunoVO) alunosListDTO.get(j);
                historico = aluno.getHistorico();

                ArrayList frequenciaListDTO = (ArrayList) aluno.getFrequencia();
                ArrayList mencaoListDTO = (ArrayList) aluno.getMencoes();

                for(int k=0; k < frequenciaListDTO.size();k++) {
                    FrequenciaVO frequencia = (FrequenciaVO) frequenciaListDTO.get(k);
                    if(!existeFrequencia(historico, frequencia))
                        if(!insereFrequencia(frequencia))
                            return false;       
                }
            	
                for(int l=0; l < mencaoListDTO.size();l++) {
                    MencaoVO mencao = (MencaoVO) mencaoListDTO.get(l);    
                    if(!existeMencao(historico, mencao))
                        if(!insereMencao(mencao))
                            return false;
                }       		        		
            }
        }	
    	return true;
    }
	
    /**
     * Verifica se existe a frequencia a partir de seu historico, id da aula e data do mes
     * @param idHistorico vo carregando o id do historico
     * @param frequencia vo carregando id da aula e data do mes
     * @return true se existir
     */
    public boolean existeFrequencia(String idHistorico, FrequenciaVO frequencia) {
        String SQL = "SELECT * FROM tb_frequencia WHERE tb_historico_ID_historico = <01> AND tb_aula_ID_aula = <02> AND DT_mes = <03>";        
        SQL = SQL.replaceAll("<01>", idHistorico);
        SQL = SQL.replaceAll("<02>", frequencia.getTbAulaIdAula().toString());
        SQL = SQL.replaceAll("<03>", frequencia.getDtMes());
        try{
            ResultSet rs = bd.getResultSet(SQL);
            if(rs.next()) return true;
        } catch (Exception ex){
            ex.printStackTrace();
        }
        return false;   		
    }    
    
    /**
     * Verifica se existe a mençao a partir do seu historico, id do tipo da mençao,
     * data da menção e tipo da sigla da menção
     * @param idHistorico
     * @param mencao
     * @return true se existir
     */
    public boolean existeMencao(String idHistorico, MencaoVO mencao) {
        try{
            String SQL2 = "select * from tb_mencao WHERE tb_historico_ID_historico = ? AND tb_tipoMencao_ID_tipoMencao = ? AND tb_SGMencao_ID_tipoMencao = ? AND DT_mencao = ?";        
            pstmt = con.prepareStatement(SQL2);
            //preenche os valores
            pstmt.setObject(1, idHistorico);   
            pstmt.setObject(2, mencao.getTbTipoMencaoIdTipoMencao());   
            pstmt.setObject(3, mencao.getTbSgMencaoIdTipoMencao());   
            pstmt.setObject(4, mencao.getDtMencao());    

            ResultSet rs = pstmt.executeQuery();                
            System.out.println(SQL2);
            if(rs.next()) return true;
        } catch (Exception ex){
            ex.printStackTrace();
        }
        return false;   		
    }    
        
    /**
     * Utilizado somente para Testes.
     */ 
    public static void main(String args[]) throws ParseException {        
        ExportaXmlParaBDDAO exporta = new ExportaXmlParaBDDAO(null);
        MencaoVO mencao = new MencaoVO();

        String dtz = "2008-10-18";
        SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
        mencao.setDtMencao(formato.parse(dtz));
        System.out.println(mencao.getDtMencao());
        mencao.setTbTipoMencaoIdTipoMencao(1);
        mencao.setTbSgMencaoIdTipoMencao(1);

        System.out.println(exporta.existeMencao("1", mencao));
    }    
    
    /**
     * Insere uma frequencia no banco
     * @param frequencia vo carregando dados da frequencia
     * @return boolean true caso haja sucesso
     */
    public boolean insereFrequencia(FrequenciaVO frequencia) {	
        try {
            pstmt = con.prepareStatement(SQL_ADD_FREQUENCIA);
            //preenche os valores
            pstmt.setObject(1, historico);   
            pstmt.setObject(2, frequencia.getTbAulaIdAula());   
            pstmt.setObject(3, frequencia.getDtMes());   
            pstmt.setObject(4, frequencia.getTpFrequencia1());   
            pstmt.setObject(5, frequencia.getTpFrequencia2());  

            pstmt.execute();	

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            bd.close(pstmt);				
        } 	
        return true;
    }
	
    /**
     * Insere uma mencao no banco
     * @param mencao vo carregando dados da mencao
     * @return boolean true caso haja sucesso
     */
    public boolean insereMencao(MencaoVO mencao) {
        try {
            pstmt = con.prepareStatement(SQL_ADD_MENCAO);
            //preenche os valores
            pstmt.setObject(1, historico);   
            pstmt.setObject(2, mencao.getTbTipoMencaoIdTipoMencao());   
            pstmt.setObject(3, mencao.getTbSgMencaoIdTipoMencao());   
            pstmt.setObject(4, mencao.getDtMencao());   
            pstmt.setObject(5, mencao.getDsMencao());  

            pstmt.execute();	

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            bd.close(pstmt);				
        } 	
        return true;
    }
	
}